<html>
    <head>
        <title>如何注入服务</title>
    </head>
    <body>
        <script>
             /*
                            十二、如何注入服务
                                  
                                    1、构造函数注入：
                                            这是将服务注入类的最常用方法：
                                            public class TaxAppService : ApplicationService
                                            {
                                                private readonly ITaxCalculator _taxCalculator;

                                                public TaxAppService(ITaxCalculator taxCalculator)
                                                {
                                                    _taxCalculator = taxCalculator;
                                                }

                                                public async Task DoSomethingAsync()
                                                {
                                                    //...use _taxCalculator...
                                                }
                                            }

                                            构造函数注入是向类注入依赖项的首选方式。
                                            这样，除非提供所有constructor-injected依赖项，否则无法构造类。
                                            因此，类明确声明了它所需的服务。

                                    2、属性注入：
                                            Microsoft依赖注入库不支持属性注入。
                                            但是，ABP可以与第3方DI提供程序（例如Autofac）集成以使属性注入成为可能。
                                            eg:
                                                public class MyService : ITransientDependency
                                                {
                                                    public ILogger<MyService> Logger { get; set; }

                                                    public MyService()
                                                    {
                                                        Logger = NullLogger<MyService>.Instance; // Logger依赖的回退值。
                                                    }

                                                    public async Task DoSomethingAsync()
                                                    {
                                                        //...use Logger to write logs...
                                                    }
                                                }
                                            对于属性注入依赖项，你可以使用public setter声明一个公共属性。
                                            这允许DI框架在创建类后对其进行设置。

                                            属性注入的依赖项通常被认为是可选依赖项。这意味着没有它们，服务可以正常工作。
                                            Logger就是这样一个依赖项，MyService可以在没有日志记录的情况下继续工作。
                                            为了使依赖项“正确地可选”，我们通常为依赖项设置一个默认/回退值。

                                            当你想设计一个默认注入了一些公共服务的基类时，属性注入也很有用。
                                            如果你打算使用构造函数注入，所有派生类也应该将依赖的服务注入到他们的恶狗早函中，这使得开发变得困难。
                                            但是，对非可选服务使用属性注入要非常小心。
                        */
        </script>
    </body>
</html>